//
// Created by 17328 on 2025/8/18.
//
/*
 * #ifndef AGCRETURN_H → 如果没有定义 AGCRETURN_H，则继续编译
 * #define AGCRETURN_H → 定义一个宏，标记该头文件已被包含
 * 下次再遇到 #include "AgcReturn.h" 时，宏已定义，就跳过
 * 作用等同于：#pragma once
 */
#ifndef AGCRETURN_H
#define AGCRETURN_H

class AgcReturn {
// private 区（私有成员，外部不可直接访问）
private:
    //  ----------------  成员变量
    long time; // 时间搓（距离1970.1.1的毫秒级时间戳）
    float AgcValue; // 需要执行的有功值
    float FrmCapacity; // 风场的装机容量
    // ------------------  构造函数
    // 构造函数被声明为 private，意味着外部无法 new 出对象。  构造的同时设置初始化默认值。
    // 头文件里直接定义函数（构造函数/析构函数/普通函数）的情况
    // 1. 只有一个 .cpp 文件包含这个头文件（include）: 编译器只会生成一份函数实现 → 没问题。
    // 2. 多个 .cpp 文件包含这个头文件（include）: 每个 .cpp 文件都会生成一份函数实现 → 链接器会报 multiple definition 或 重复符号 错误。
    AgcReturn() {
        time = 0;
        AgcValue = -1;
        FrmCapacity = 0;
    }

    // 这是一个 静态成员变量，保存指向类自身的唯一实例的指针。
    // 结合私有构造函数 → 这是典型的 单例模式（Singleton Pattern）。
    static AgcReturn* Instance;

    // 析构函数
    ~AgcReturn();

    // 禁止拷贝和赋值
    AgcReturn(const AgcReturn&) = delete;
    AgcReturn& operator=(const AgcReturn&) = delete;

// public 区（公共成员，外部可访问）
public:
    void SetTime(long time);
    void SetAgcValue(float value);
    void SetFrmCapacity(float capacity);
    long GetTime();
    float GetAgcValue();
    float GetFrmCapacity();
    // 提供设置回复参数的方法，in[]: 装机容量, 数组长度, 数组长度的参数
    void SetAgcReturnParameters(float in[]);
    // 实现单例模式，应该声明为一个 静态函数，返回唯一实例
    static AgcReturn* getInstance();
    // 设置回复参数数组【建议：不要使用static修饰为类变量】
    float* AgcReturnParameters = nullptr;
};

#endif //AGCRETURN_H
